#coding=utf-8
import  numpy
import math
def wordRS(queryq,ganma,yita,dictionary):#定义一个函数queryq为输入查询文档,ganma 为设定输入要截取的词项数，yita为字典其他文档选取词项数
    idx = 0
    i=0
    q_list = [list(sorted(item.items(), key=lambda x: -x[1])) for item in queryq]
    q1 = []
    q2=[]
    for item in q_list:#摘取出查询文档的高频词
        for j in item:
            q1.append(j[0])#拿出查询文档词['c','a','g']
            q2.append(j[1]) #拿出查询文档词对应的tfidf[0.8,0,6,0.4]
    i = 0
    sq2= 0
    # 计算出q2模平方
    while i < len(q2):
        sq2 = sq2 + q2[i] * q2[i]  # pow(a,2)
        i = i + 1
    for item in dictionary: #遍历字典里面的所有项，从第零项开始 doc是辉辉建立的那个字典，名称定义需要看辉辉
        if len(set(q1[:ganma]).difference([item[0] for item in list(sorted(item.items(), key=lambda x: -x[1]))][:yita]))==0:  # 判断queryq 是不是某篇文档的子集，挑出词典里面与queryq相似的文档，选择q_lisyde前ganma个词作为代表，与其他篇文档的前yita个词进行自己查询 找到相似的文档
            docre[i]=idx
            i += 1
        idx += 1
    idxs = set(docre) #前k篇文档序号
    doc1=[sorted(dictionary[item].items(), key=lambda x: -x[1]) for item in idxs]
    word_list=[]
    for item in doc1:
        #一篇文档 item[(a,0,25),(b.0,16),(c,0.05)]
        for j in item:
            if j[0] not in q1:
                word_list.append(j[0])
        # 文档里面的词 j ('a',0.25)'

    score=[]#记录余弦相似度大小
    for item in doc1:
        cheng = 0
        sum_d=0
        k = 0
        while k < len(q1):  # q1=[c,a,g]
            for j in item:
                sum_d=sum_d+j[1]*j[1] #文档模长
                if j[0]==q1[k]:
                    cheng=cheng+j[1]*q2[k] #q2与文档的点乘
            k += 1
        score.append(float(cheng)/(math.sqrt(sq2) * math.sqrt(sum_d)))#记录所有的文档余弦值
    doc_order=dict(zip(list(idxs),score))
    doc_order=sorted(doc_order.items(),key=lambda x: -x[1])
    order=[]
    for item in doc_order:
        order.append(item[0])

    return order,list(set(word_list)) #返回字典中相关的文档序号list(set(docre))，返回查询相关的高频词list(set(word_list))

if __name__ =='__main__':
    dictionary=[{'a':0.25,'b':0.16,'c':0.05},{'b':0.1,'d':0.32,'e':0.36},{'a':0.3,'c':0.32,'d':0.25},{'b':0.41,'d':0.62,'e':0.35}]#文档词项字典
    a=[{'a':0.6,'c':0.8,'g':0.4}]#输入要查询相关推荐的文档
    docre = numpy.array([0] * 100)  # 存储要输出的相关文档
    yita=3
    ganma=2
    aq,bq=wordRS(a,ganma,yita,dictionary)
    print('相关文档序号:',aq)
    print('相关文档中的出现的高频', bq)
